package ciudad;


import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;


@XmlRootElement

public class Ciudad {
	@XmlTransient
	private Esquina[][] esquinas;
	private int cantidadDeCallesVerticales;
	private int cantidadDeCallesHorizontales;
	
	public Ciudad(){}
	
	
	public Ciudad (int cantidadDeCallesHorizontales, int cantidadDeCallesVerticales){
		this.esquinas = new Esquina[cantidadDeCallesHorizontales][cantidadDeCallesVerticales];
		this.agregarEsquinas(cantidadDeCallesHorizontales, cantidadDeCallesVerticales);
		this.cantidadDeCallesVerticales = cantidadDeCallesVerticales;
		this.cantidadDeCallesHorizontales = cantidadDeCallesHorizontales;
	}
	
	/* Agrega las esquinas a la ciudad
	 * Recibe por parametro las dimensiones de la ciudad a crear
	 * siendo estas la cantidad de callesHorizontales y la cantidadCallesVerticales.*/
	private void agregarEsquinas(int cantidadDeCallesHorizontales,
			int cantidadDeCallesVerticales) {
		for (int indiceFila = 0; indiceFila < cantidadDeCallesHorizontales; indiceFila++) {
			for (int indiceColumna = 0; indiceColumna < cantidadDeCallesVerticales; indiceColumna++) {
				Esquina nuevaEsquina = new Esquina();
				setEsquinaEnPosicion(nuevaEsquina, indiceFila, indiceColumna);
				
				if (indiceColumna > 0) {
					
					Esquina esquinaOeste = this.getEsquinaEnPosicion(indiceFila, indiceColumna - 1);
					nuevaEsquina.setEsquinaOeste(esquinaOeste);
					esquinaOeste.setEsquinaEste(nuevaEsquina);
				}
				if (indiceFila > 0) {
					Esquina esquinaNorte = this.getEsquinaEnPosicion(indiceFila - 1, indiceColumna);
					nuevaEsquina.setEsquinaNorte(esquinaNorte);
					esquinaNorte.setEsquinaSur(nuevaEsquina);
				}
			}
		}
		
	}
	
	/* Coloca la esquina pasada por parametro en las fila y columna indicada. */
	public void setEsquinaEnPosicion(Esquina esquina, int numeroDeFila, int numeroDeColumna) {
		esquinas[numeroDeFila][numeroDeColumna] = esquina;
	}
	
	/* Devuelve la esquina que se encuentra en la posicion indicada
	 * por la fila y columna pasada por parametro. */
	public Esquina getEsquinaEnPosicion(int numeroDeFila, int numeroDeColumna) {
		return esquinas[numeroDeFila][numeroDeColumna];
	}
	
	/* Setea las esquinas, por las pasadas por parametro. */
	@XmlElement
	public void setEsquinas(Esquina[][] esquinas){
		this.esquinas = esquinas;
		
	}
	
	/* Devuelve las esquinas. */
	public Esquina[][] getEsquinas(){
		return this.esquinas;
	}
	
	/* Setea la cantidad de calles verticales por la cantidad pasada por parametro. */
	@XmlElement
	public void setCantidadDeCallesVerticales(int cantidadDeCallesVerticales){
		this.cantidadDeCallesVerticales = cantidadDeCallesVerticales;
	}
	
	/* Devuelve la cantidad de calles verticales. */
	public int getCantidadDeCallesVerticales() {
		return cantidadDeCallesVerticales;
	}
	
	/* Setea la cantidad de calles horizontales por la cantidad pasada por parametro. */
	@XmlElement
	public void setCantidadDeCallesHorizontales(int cantidadDeCallesHorizontales){
		this.cantidadDeCallesHorizontales = cantidadDeCallesHorizontales;
	}
	
	/* Devuelve la cantidad de calles verticales. */
	public int getCantidadDeCallesHorizontales() {
		return cantidadDeCallesHorizontales;
	}
	
	/* Devuelve una lista cuyos elementos son del tipo integer.
	 * El primer elemento corresponde a la fila y el segundo corresponde a la columna
	 * de la posicion en donde se encuentra la esquina pasada por parametro. */
	public List<Integer> getPosicionDeEsquina(Esquina unaEsquina) {
		List<Integer> posiciones = new ArrayList<Integer>();
		
		for (Integer indiceFila = 0; indiceFila < this.getCantidadDeCallesHorizontales(); indiceFila++) {
			for (Integer indiceColumna = 0; indiceColumna < this.getCantidadDeCallesVerticales(); indiceColumna++) {
				Esquina esquinaActual = this.getEsquinaEnPosicion(indiceFila, indiceColumna);
				
				if (esquinaActual == unaEsquina) {
					posiciones.add(indiceFila);
					posiciones.add(indiceColumna);
					return posiciones;
				}
			}
		}
		return posiciones;
	}
}
